All files / src/app/api/dev/tickets/[id]/history route.ts

0% Statements 0/65
100% Branches 0/0
0% Functions 0/1
0% Lines 0/65

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66                                                                                                                                   
export const dynamic = "force-dynamic";

/**
 * Dev Ticket History API
 * GET /api/dev/tickets/[id]/history - Get ticket history/audit trail
 */

import { NextRequest, NextResponse } from 'next/server';
import { } from "next-auth";
import {
  withAdmin,
  withErrorHandling,
  successResponse,
  ApiError,
  ApiSuccessResponse,
  ApiErrorResponse } from "@/lib/api";
import { RouteContext } from "@/lib/api/middleware";
import { prisma } from '@/lib/prisma';

interface RouteParams {
  params: Promise<{ id: string }>;
}

async function handleGet(
  request: NextRequest,
  context: RouteContext | undefined
): Promise<NextResponse<ApiSuccessResponse<unknown> | ApiErrorResponse>> {
  const { id } = await (context as RouteParams).params;
  const { searchParams } = new URL(request.url);
  const limit = Math.min(parseInt(searchParams.get('limit') || '50', 10), 100);
  const offset = parseInt(searchParams.get('offset') || '0', 10);

  // Verify ticket exists
  const ticket = await prisma.devTicket.findUnique({
    where: { id },
    select: { id: true } });

  if (!ticket) {
    throw ApiError.notFound('Ticket not found');
  }

  // Get total count
  const total = await prisma.devTicketHistory.count({
    where: { ticketId: id } });

  // Get history entries
  const history = await prisma.devTicketHistory.findMany({
    where: { ticketId: id },
    include: {
      performedBy: {
        select: { id: true, name: true, email: true, image: true } } },
    orderBy: { createdAt: 'desc' },
    skip: offset,
    take: limit });

  return successResponse({
    data: history,
    pagination: {
      total,
      limit,
      offset,
      hasMore: offset + history.length < total } });
}

export const GET = withErrorHandling(withAdmin(handleGet));